<?php
/*
 BACKUP.INC.PHP by martin $ 2009/12/01 03:33:15
*/

checkADMIN();

$header = $body = '';

$CLEAR = '<hr class="clear" />'; # 記事に複数の画像がある際に、仕切りをいれるか。

if(v_('type')=='archives'){  # ARCHIVES
 $notyet = 0; 
 include_once ($archives_ini=OD.'mht.ini.php');
 $yyyymm = p_('tlog')!='' ? array_keys(p_('tlog')) : array(0=>'');
 if($yyyymm[0]!=''){
  include_once('modules/archives.inc.php');
  html2archives($yyyymm[0]);
 }

 if(count($MHT_LIST) != count($LOGS)){
  $MHT_LIST = array();
  foreach($LOGS as $i=>$logs){
   $_count = count( my_file($logs) );
   if($_count==0) continue;
   $MHT_LIST[] = str_replace(EXT, '', basename($logs)).'|0|'.filemtime($logs).'|'.$_count.'|0|';
  }
  rewrite_ini($archives_ini, $MHT_LIST);
 }
 $body = '<fieldset>
<input type="hidden" name="mode" value="backup" />
<input type="hidden" name="type" value="archives" />
<table style="width:580px; margin: auto; font-size:90%; background:#fff;">
 <colgroup><col span="5" class="center" /></colgroup>
 <tr><th>アーカイブ</th><th>記事数</th><th title="生成されたアーカイブのサイズです">サイズ</th><th>ログの最終更新</th><th>バックアップ日時</th><th>状態</th></tr>
';
 foreach($MHT_LIST as $i=>$archives){
  list($date, $created, $lastmod, $_count, $fsize) = explode('|', $archives);
  $fsize = (isset($fsize) && $fsize > 0) ? sprintf('%01.1f', $fsize/1024).'KB' : ' - ';
  $_archives = '<td><a href="index.php?date='.$date.'">'.substr($date, 0,4)."年".substr($date,4,2)."月</a></td><td>$_count</td><td>$fsize</td>";
  if($created==0){
   $notyet++;
   $_archives .= '<td>'.date('Y/m/d H:i:s', $lastmod).'</td><td> &mdash; </td><td><input type="image" name="tlog['.$date.']" src="Images/alert.png" alt="X" title="アーカイブを作成します" /></td>';
  } else {
   if($created > $lastmod){
    $icon = '<input type="image" name="tlog['.$date.']" src="Images/safe.png" alt="Safe" />';
   } else $icon = '<input type="image" name="tlog['.$date.']" src="Images/notice.png" alt="ログが更新されてます!" />';
   $_archives .= '<td>'.date('Y/m/d H:i:s', $lastmod).'</td><td>'.date('Y/m/d H:i:s', $created).'</td><td>'.$icon.'</td>';
  }
  $body .= '<tr>'.$_archives.'</tr>'.NL;
 }

 $body .= '</table>
 </fieldset>
</form>
 ';

 if($notyet > 0){
  $header = '<h4 class="alert"><span>'.count($MHT_LIST).' 件中 '.$notyet.' 件のログが未バックアップです。バックアップをお勧めします</span></h4>'.NL;
 }
 $header .= '
<style type="text/css">
 .intro { font-size:90%; margin: 1.5em auto -15px auto; }
 .intro img {vertical-align: middle;}
</style>
<h5 style="" class="intro center">
 <img src="Images/alert.png" width="18" height="18" alt="Alert" /> 未バックアップ
 <img src="Images/notice.png" width="18" height="18" alt="notice" /> バックアップ後にログ修正あり
 <img src="Images/safe.png" width="18" height="18" alt="Safe" /> 最新の状態でバックアップ済み
</h5>
<form action="admin.php" method="post" style="width: 600px;">
<ul class="p2em">
 <li>バックアップにあたり、まずはこのアイコン <a href="admin.php?mode=backup&type=archives">
  <img src="Images/reload1.png" width="32" height="29" alt="Refresh" style="vertical-align: middle;" /></a>をクリックしてバックアップ情報を更新して下さい。</li>
 <li>状態アイコンをクリックするとHTML形式のアーカイブが作成されます。</li>
 <li>アーカイブが作成されるとダウンロードを促すダイアログが出てくると思いますので，適切な場所にダウンロードして下さい。</li>
</ul>
 ';

 return $DIVISION['body'] .= $header.$body;
}  # end ARCHIVES


if(v_('type')=='mtexport'){ # MT形式エクスポート
 include_once ($mt_ini=OD.'mt.ini.php');
 $yyyymm = p_('tlog')!='' ? array_keys(p_('tlog')) : array(0=>'');
 if($yyyymm[0]!=''){
  include_once('modules/mtexport.inc.php');
  html2mtexport($yyyymm[0]);
 }

 $header = '
<style type="text/css">
 .intro { font-size:90%; margin: 1.5em auto -15px auto; }
 .intro img {vertical-align: middle;}
</style>
<h5 style="" class="intro center">
 <img src="Images/alert.png" width="18" height="18" alt="Alert" /> エクスポート歴なし
 <img src="Images/notice.png" width="18" height="18" alt="notice" /> エクスポート後にログ修正あり
 <img src="Images/safe.png" width="18" height="18" alt="Safe" /> 最新の状態でエクスポート
</h5>
<form action="admin.php" method="post" style="width: 600px;">
<ul class="p2em">
 <li>状態アイコンをクリックするとMT形式互換ファイルが作成されます。</li>
 <li>MT形式ファイルが作成されるとダウンロードを促すダイアログが出てくると思いますので，適切な場所にダウンロードして下さい。</li>
</ul>
 ';

 if(empty($MT_LIST)){
  $MT_LIST = array();
  foreach($LOGS as $i=>$log){
   $_count = count( my_file($log) );
   if($_count==0) continue;
   $MT_LIST[] = str_replace(EXT, '', basename($log)).'|0|'.filemtime($log).'|'.$_count.'|';
  }
  rewrite_ini($mt_ini, $MT_LIST);
 } else {
  if(count ($LOGS) > count($MT_LIST)){
   $MT_LIST = array();
   foreach($LOGS as $i=>$log){
    $_count = count( my_file($log) );
    $_log = str_replace(EXT, '', basename($log));
    if($_count==0) continue;
    $hit = preg_grep('{^$log}', $MT_LIST);
    if(!empty($hit)){
     $hit = $hit[0];
     list($date, $created,,) = explode('|', $hit);
     $MT_LIST[] = $_log.'|'.$created.'|'.filemtime($log).'|'.$_count.'|';
    } else $MT_LIST[] = $_log.'|0|'.filemtime($log).'|'.$_count.'|';
   }
   rewrite_ini($mt_ini, $MT_LIST);
  }
 }
 $body = '<fieldset><legend>MT EXPORT</legend>
<input type="hidden" name="mode" value="backup" />
<input type="hidden" name="type" value="mtexport" />
<table style="width:90%;margin:auto;font-size:90%;">
 <colgroup><col span="5" class="center" /></colgroup>
 <tr><th>アーカイブ</th><th>ログ更新日時</th><th>記事数</th><th>バックアップ作成日時</th><th> 状 態 </th></tr>
';
 foreach($MT_LIST as $i=>$mt){
  list($date, $created, $lastmod, $_count) = explode('|', $mt);
  
  $_mt = '<td><a href="index.php?date='.$date.'01">'.substr($date, 0,4).'年'.substr($date,4,2).'月</a></td>';
  if($created==0){
   $_mt .= '<td>'.date('Y/m/d H:i:s', $lastmod).'</td><td>'.$_count.'</td><td> &mdash; </td><td><input type="image" name="tlog['.$date.']" src="Images/alert.png" alt="X" title="MT形式ファイルを作成します" /></td>';
  } else {
   if($created > $lastmod){
    $icon = '<input type="image" name="tlog['.$date.']" src="Images/safe.png" alt="Safe" />';
   } else $icon = '<input type="image" name="tlog['.$date.']" src="Images/notice.png" alt="ログが更新されてます!" />';
   $_mt .= '<td>'.date('Y/m/d H:i:s', $lastmod).'</td><td>'.$_count.'</td><td>'.date('Y/m/d H:i:s', $created).'</td><td>'.$icon.'</td>';
  }
  $body .= '<tr>'.$_mt.'</tr>'.NL;
 }

 $body .= '</table>
 </fieldset>
</form>
 '; 
 return $DIVISION['body'] .= $header.$body;
} # MT EXPORT


if(v_('type')=='mtimport'){ # MT形式インポート
 $cat_ini = OD.'category.ini.php';
 $thru_ini = OD.'mtthru.ini.php';
 include ($cat_ini);
 $COPY_FAILED = $THRU_LIST = array();
 if(is_file($thru_ini)){
  include($thru_ini);
 } else rewrite_ini($thru_ini, '', '$THRU_LIST'); # Create New ini
 if(p_('thru') != ''){
  $THRU = explode("`", p_('thru', 0));
  foreach ($THRU as $thru){
   if(trim($thru)=='') continue;
   $NEW_THRU_LIST[] = trim($thru);
  }
  $THRU_LIST = array_unique($NEW_THRU_LIST);
  rewrite_ini($thru_ini, $THRU_LIST);
 }
 $target_file = isset($_FILES['src']) ? DB.basename($_FILES['src']['name']) : '';
 if(isset($_FILES['src']) && move_uploaded_file($_FILES['src']['tmp_name'], $target_file)){
  $target = get_file_content($target_file);
  if($mb){
   $encode = mb_detect_encoding($target, 'utf-8,euc-jp,sjis');
   $target = mb_convert_encoding ($target, ENCODE, $encode);
  } else $target = jcode_convert_encoding($target, ENCODE);
  
  $target = preg_replace('{\r|\r\n|\n}', NL, $target);

  $parts = explode('--------', $target);

  foreach ($parts as $part){

   if(trim($part)=='') continue;
   if(preg_match('{DATE:(.*?)\n}', $part, $m)){
    list($date, $time) = explode(' ', trim($m[1]), 2);
    list($month, $day, $year) = explode('/', $date); # e.g. 02/14/2007 12:37:01 AM
    $date = strtotime($year.'-'.$month.'-'.$day.' '.$time);
    $uid = ($date < 0) ? time() : $date;
   }
   if(!preg_match('/^\d+$/', $uid)) return $DIVISION['body'] .= '<p class="alert-p">$uidの取得に失敗！</p>';
   $author = preg_match('{AUTHOR:(.*?)\n}', $part, $m) ? sanitize_data($m[1]) : 'foo';
   $title = preg_match('{TITLE:(.*?)\n}', $part, $m) ? sanitize_data($m[1]) : 'No title';
   $title = str_replace('&#44;', ',', $title);
   $tags = preg_match('{TAGS:(.*?)\n}', $part, $m) ? sanitize_data($m[1], 0) : '';
   if(preg_match('{PRIMARY CATEGORY:(.*?)\n}', $part, $m)){
    $category = sanitize_data($m[1]);
   } else $category = '';
   if(preg_match('{\nCATEGORY:(.*?)\n}', $part, $m)){
    if($category==''){
     $category = sanitize_data($m[1]);
    } else {
     if($category != sanitize_data($m[1])){
      $category = $category.','.sanitize_data($m[1]); # subCategory
     }
    }
   }
   $category = ($category=='') ? MISC : $category;
   $hit = FALSE;
   foreach ($CATEGORY_LIST as $C) if(strstr($C, "$category\t")) $hit = TRUE;
   if($hit == FALSE){
    $CATEGORY_LIST[] = "$category\t".url_encode($category)."|0";
    rewrite_ini($cat_ini, $CATEGORY_LIST);
    include ($cat_ini);
   }
   $status = preg_match('{STATUS:(.*?)\n}', $part, $m) ? (strtolower(trim($m[1]))=='draft' ? 'd' : '') : '';
   $allow_comments = preg_match('{ALLOW COMMENTS:(.*?)\n}', $part, $m) ? trim($m[1]) : 0;
   $allow_pings = preg_match('{ALLOW PINGS:(.*?)\n}', $part, $m) ? trim($m[1]) : 0;
   $convert_breaks = preg_match('{CONVERT BREAKS:(.*?)\n}', $part, $m) ? trim($m[1]) : 0;
   $entry_body = preg_match('{BODY:(.*?)-----\n}s', $part, $m) ? sanitize_data($m[1], 0) : '?';
   $extended_body = preg_match('{EXTENDED BODY:(.*?)-----\n}s', $part, $m) ? sanitize_data($m[1], 0) : '';
   $excerpt = preg_match('{EXCERPT:(.*?)-----\n}s', $part, $m) ? sanitize_data($m[1], 0) : '';

   $bodies = array(1=>$entry_body, 2=>$extended_body);
   
   foreach ($bodies as $page=>$target_body){
    if($target_body == '') continue;
    if(preg_match_all('{<img .*?src="([^"]+?)"[^>]*?>}i', $target_body, $imgsrc)){
     $imgCount = count($imgsrc[1]);
     for ($j=0; $j<$imgCount; $j++){
      $img = $imgsrc[1][$j]; $thruFlag = FALSE;
      foreach($THRU as $thru){
       if(trim($thru)=='') continue;
       if(strpos($img, $thru)){$thruFlag = TRUE; break;}
      }
      if($thruFlag) continue;
      $alt = preg_match('{alt="([^:"]*?)"}i', $img, $alt) ? $alt[1] : '';
      $tar = strpos($img, '-thumb.') ? str_replace('-thumb.','.', $img) : $img;
      if(!is_file($tar)) continue;
      list($w, $h, $imgtype, $wh) = getimagesize($tar);
      if(isset($w, $h) && min($w,$h) != 0){
       $attached_file = DB.str_replace(array('_', ' ', '　'), '-', basename($tar));
       if(copy($tar, $attached_file) || rename($tar, $attached_file)){
        $fs = round(filesize($attached_file)/1024,1);
        $target_dir = IMG_DIR; $isImage = TRUE;
        include('upload.php'); // $outputをゲット
        $output = $output.$CLEAR;
        $mt_type1 = '<a href="'.str_replace('-thumb.', '.', $imgsrc[1][$j]).'">'; # サムネイルあり・埋め込み
        $mt_type2 = '<a href="'.($url=str_replace('-thumb.jpg', '.html', $imgsrc[1][$j])).'" onclick="window.open(\''.$url.'\',\'popup\',\'width='.$w.',height='.$h.',scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false">'; # サムネイルあり・ポップアップ
        if(strstr($target_body, $mt_type1)){
         $target_body = str_replace($mt_type1.$imgsrc[0][$j].'</a>', $output, $target_body);
        }
        if(strstr($target_body, $mt_type2)){
         $target_body = str_replace($mt_type2.$imgsrc[0][$j].'</a>', $output, $target_body);
        }
        $target_body = str_replace($imgsrc[0][$j], $output, $target_body);
       } else $COPY_FAILED[] = $img;
      }
     }
     if($page==1) $entry_body = $target_body;
     if($page==2) $extended_body = $target_body;
    }
   }
   $targetLog = log_($uid);
   if(!is_file($targetLog)) mk_fl(LOG.date('Ym', $uid).EXT);
   $LINES = file($targetLog);
   foreach ($LINES as $line){
    if(preg_match('{^'.$uid.'d?\|}', $line)) $uid = (int)($uid + mt_rand(10,100));
   }
   $rep = array('{<br( /|)>}', '{<a\s+href="([^"]+?)"\s+onclick="window.open\([^"]+?"[^>]*?>}');
   $ret = array('`', '<a href="\\1">');
   $entry_body = str_replace(' target="_blank"', '', $entry_body);
   $entry_body = preg_replace($rep, $ret, $entry_body);
   $entry_body = str_replace(array_keys($_FILTER), array_values($_FILTER), $entry_body);
   if($extended_body != ''){
    $extended_body = str_replace(' target="_blank"', '', $extended_body);
    $extended_body = preg_replace($rep, $ret, $extended_body);
    $extended_body = str_replace(array_keys($_FILTER), array_values($_FILTER), $extended_body);
   }
   $logFormat = "$uid$status|$category|$title|$entry_body|$author|".($allow_comments==1?1:0)."|".($allow_pings==1?1:0)."|$excerpt|$extended_body|\n"; // ログのフォーマット   
   $LINES[] = $logFormat;
   usort($LINES, 'SORT_BY_DATE');
   rewrite($targetLog, $LINES);
   if(preg_match_all('{COMMENT:(.*?)-----'.NL.'}s', $part, $m)){ // コメントがあるなら
    $CMT_file = CMT_DIR.$uid.EXT;
    mk_fl($CMT_file);
    $length = count($m[1]);
    $CMT_LINES = array();
    $CMT_INIT = $uid.'|'.$category.'|'.$title.'|'.$length.'|0'.NL; // コメントログの1行目は親情報
    $CMT_LINES = array();
    for ($i=0; $i< $length; $i++){
     if(preg_match('{DATE:(.*?)\n}', $m[1][$i], $mt)){
      list($date, $time) = explode(' ', trim($mt[1]), 2);
      list($month, $day, $year) = explode('/', $date); # e.g. 02/14/2007 12:37:01 AM
      $date = strtotime($year.'-'.$month.'-'.$day.' '.$time);
      $date = ($date < 0) ? time() : $date;
     }
     if(!preg_match('/^\d+$/', $date)) return $DIVISION['body'] .= '<p class="alert-p">$dateの取得に失敗！</p>';
     $poster = preg_match('{AUTHOR:(.*?)\n}', $m[1][$i], $mt) ? sanitize_data($mt[1]) : 'foo';
     $ip = preg_match('{IP:(.*?)\n}', $m[1][$i], $mt) ? sanitize_data($mt[1]) : '';
     $url = preg_match('{URL:(.*?)\n}', $m[1][$i], $mt) ? sanitize_data(strip_tags($mt[1])) : '';
     $mail = preg_match('{EMAIL:(.*?)\n}', $m[1][$i], $mt) ? sanitize_data($mt[1]) : '';
     $comment = preg_replace('{.*?(?:AUTHOR|EMAIL|IP|URL|DATE):.+$}m', '', $m[1][$i]);
     $comment = sanitize_data($comment);
     $comment = str_replace(array('&lt;br /&gt;','&lt;br&gt;','`'), '<br />', $comment);
     $com_back_mail = preg_match("{^[0-9a-z\.\-\_!#$%&]+?@[^.]+\..+}i", $mail) ? my_encrypt($mail) : '';
     $CMT_LINES[] = "$date|$poster|555555|$comment|$ip|$url|$com_back_mail|0|".NL; # comment format
    } # for loop
    usort($CMT_LINES, 'SORT_BY_DATE');
    $CMT_LINES = array_reverse($CMT_LINES);
    array_unshift($CMT_LINES, $CMT_INIT);
    rewrite($CMT_file, $CMT_LINES);
   } # comment
   
   if(preg_match_all('{PING:(.*?)-----\n}s', $part, $m)){ // トラックバックがあるなら
    $TB_file = TB_DIR.$uid.EXT;
    mk_fl($TB_file);
    $TB_LINES = array();
    
    $length = count($m[1]);
    for ($i=0; $i< $length; $i++){
     if(preg_match('{DATE:(.*?)\n}', $m[1][$i], $mt)){
      list($date, $time) = explode(' ', trim($mt[1]), 2);
      list($month, $day, $year) = explode('/', $date); # e.g. 02/14/2007 12:37:01 AM
      $date = strtotime($year.'-'.$month.'-'.$day.' '.$time);
      $date = ($date < 0) ? time() : $date;
     }
     if(!preg_match('/^\d+$/', $date)) return $DIVISION['body'] .= '<p class="alert-p">$dateの取得に失敗！</p>';
     $title = preg_match('{TITLE:(.*?)\n}', $m[1][$i], $mt) ? sanitize_data($mt[1]) : 'bar';
     $url = preg_match('{URL:(.*?)\n}', $m[1][$i], $mt) ? sanitize_data(strip_tags($mt[1])) : '';
     $ip = preg_match('{IP:(.*?)\n}', $m[1][$i], $mt) ? sanitize_data($mt[1]) : '';
     $blog_name = preg_match('{BLOG NAME:(.*?)\n}', $m[1][$i], $mt) ? sanitize_data($mt[1]) : '';
     $excerpt = preg_replace('{.*?(?:TITLE|BLOG NAME|IP|URL|DATE):.+$}m', '', $m[1][$i]);
     $excerpt = str_replace('`', '', sanitize_data($excerpt));
      
     $info = array(
      'entry'     => $date,
      'url'       => rawurlencode($url),
      'title'     => rawurlencode(my_convert_encoding($title, ENCODE, 'auto')),
      'excerpt'   => rawurlencode(my_convert_encoding($excerpt, ENCODE, 'auto')),
      'blog_name' => rawurlencode(my_convert_encoding($blog_name, ENCODE, 'auto')),
      'ping_url'  => rawurlencode(my_convert_encoding($ip, ENCODE, 'auto'))
     );
     array_unshift($TB_LINES, $info);
    } # for loop
    rewrite($TB_file, serialize($TB_LINES));
   }# TrackBack

   if($tags != ''){ # タグがある場合
    include_once (OD.'tags.ini.php');
    foreach (explode(',', $tags) as $tag){
     if(strstr($tag, '"')) $tag = mb_str_replace(array('"'), array(''), $tag);
     $hit = preg_grep('/'.preg_quote($tag).'\|/', $TAGS_LIST);
     if(!empty($hit)){
      $index = array_keys($hit); $index = $index[0];
      $TAGS_LIST[$index] = $TAGS_LIST[$index].','.$uid;
     } else {
      $TAGS_LIST[] = $tag.'|'.$uid;
     }
    }
    rewrite_ini(OD.'tags.ini.php', $TAGS_LIST);
   }
   if(is_file(PATH.$target_file)) unlink(PATH.$target_file);
   update_cache(array('recently', 'recent_comments', 'recent_trackbacks', 'category', 'articles_volume'));
   if(empty($COPY_FAILED)){
    showMessage(' インポートしました ');
   } else {
     $body .= '<p class="alert center">以下の画像ファイルのコピーに失敗しました。サーバーの仕様によってはコピー不可のこともあります。</p><ol>';
    foreach ($COPY_FAILED as $img) $body .= ' <li>'.$img.'</li>'.NL;
    $body .= '</ol>'.NL;
   }
  }
 } # move_uploaded_file
 
 $body .= '
<form action="admin.php?mode=backup&amp;type=mtimport" enctype="multipart/form-data" method="post"
  style="background: url(Images/import.png) no-repeat 95% 93%; margin-top: 1.5em; width: 520px;">
<fieldset><legend>MT IMPORT</legend>
<input type="hidden" name="mode" id="mode" value="backup" />
<ul class="p2em">
 <li><a href="http://www.movabletype.jp/documentation/appendices/import-export-format.html" onclick="window.open(this.href,\'\');return false;">Movable Type形式</a>のログファイルを指定して下さい</li>
 <li>今では，色んなブログツールが，MT形式の書き出しに対応していると思います</li>
 <li>記事に画像（IMGタグ）が含まれていれば、ppBlogは、サーバー上の画像をゲットしようと試みます。その際は、サムネイル画像ではなくて、元のサイズの画像の取得を試みます</li>
 <li>プログラム上、IMGタグに対しては、すべてコピーを試みるわけですが、アマゾンや楽天などアフェリエイトの画像まで取得するのは
余計です。なので、IMGタグの src に指定文字列が含まれていれば、スルーするようにしています。これは各自で設定して下さい。
１行１文字列で（ドメインである必要はありません）。</li>
 <li>「＋」ボタンをクリックするとインポートを開始します。</li>
</ul>
 <div style="margin: 1em auto; width: 400px;">
 <table>
  <tr><td style="width: 130px;">スルーする文字列：</td>
   <td>
<textarea name="thru" id="thru" cols="12" rows="4" />';
if(empty($THRU_LIST)) $THRU_LIST = array('amazon.co', 'rakuten.co');
foreach ($THRU_LIST as $list) $body .= trim($list).NL;
$body .= '</textarea></td>
  </tr>
  <tr>
   <td class="rt">MTファイル：</td>
   <td class="lt">
   <input type="file" name="src" id="src" size="25" />
   <input type="image" src="Images/add2_1.png" title="インポートします"
    style="vertical-align: middle;"
    onmouseover="this.src=\'Images/add2_2.png\';"
    onmouseout="this.src=\'Images/add2_1.png\'" alt="Add" /></td>
  </tr>
 </table>
 </div>
</fieldset>
</form>
 ';

 return $DIVISION['body'] .= $header.$body;
} # MT形式インポート ここまで

?>
